package com.Hsu.mq.common;

import java.io.*;

/**
 * @author Hsu琛君珩
 * @ClassName:BinaryTool
 * @date 2024-02-15
 * @apiNote
 * @Version: v1.0
 */

/**
 * 下列逻辑不仅仅是 Message 对象，其他的 Java 中的对象也是可以这样序列化/反序列化
 * 不过需要让这个类先实现 Serializable 接口
 * 一个工具类，提供静态方法来实现Java对象与字节数组之间的序列化和反序列化操作
 */
public class BinaryTool {
    //把一个对象，序列化成一个字节数组
    public static byte[] toBytes(Object object) throws IOException {
        //这个流对象相当于一个变长的字节数组
        //就可以把 object 序列化的数据逐渐写到 byteArrayOutputStream，再统一转为 byte[]
        //ByteArrayOutputStream 是纯内存的，就不必关闭，关闭也行
        try(ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream()){
            try(ObjectOutputStream objectOutputStream=new ObjectOutputStream(byteArrayOutputStream)){
                //此处的 writeObject 就会把该对象进行序列化，生成的二进制字节数据就会写入到 ObjectOutputStream
                //由于 ObjectOutputStream 又是关联到了 ByteArrayOutputStream 最终结果就是写入到 ByteArrayOutputStream
                objectOutputStream.writeObject(object);
            }
            //把 byteArrayOutputStream 中持有的二进制数据取出来，转成 byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }

    //把一个字节数组，反序列化成一个对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object=null;
        try(ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(data)){
            try(ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream)){
                //此处的 readObject 就是从 data 这个 byte[] 中读取数据并进行反序列化
                object=objectInputStream.readObject();
            }
        }
        return object;
    }
}